import axios from 'axios';
import Interceptors from './interceptors.js';
Interceptors.request(axios);
Interceptors.response(axios);

/**
 * 基础 Api
 * @params virtualPath 虚拟目录
 */
class BaseApi {
    /**
     * @params {string} virtualPath虚拟目录
     */
    constructor(virtualPath) {
        let baseUrlInfo = this.getBaseUrlInfo();
        virtualPath = virtualPath || '';
        this.baseUrl = baseUrlInfo.domain + ':' + location.port + '/' + virtualPath; //请求baseurl
    }

    /**
     * 构建baseurl
     */
    getBaseUrlInfo() {
        let domain = ''; //域名
        domain = '//' + location.hostname;
        return {
            domain: domain,
        };
    }

    /**
     * 统一post请求
     * @param params {Object} 请求参数
     */
    post(params) {
        this.setRequestParams(params);
        return axios.post(params.baseUrl + params.url, params.data, {
            withCredentials: true,
        });
    }

    /**
     * 统一get请求
     * @param params {Object} 请求参数
     */
    get(params) {
        this.setRequestParams(params);
        return axios.get(params.baseUrl + params.url, {
            params: params.data,
            withCredentials: true,
        });
    }

    /**
     * 统一jsonp请求
     */
    jsonp(params) {
        return new Promise((resolve, reject) => {
            try {
                var cbFunc = '_tcjp' + new Date().getTime();
                window[cbFunc] = function (data) {
                    resolve(data);
                    document.body.removeChild(script);
                };
                this.setRequestParams(params);
                params.url += params.url.indexOf('?') == -1 ? '?' : '&';
                params.url += tcUtils.objectToQString(params.data);
                params.url += 'callback=' + cbFunc;
                // 创建script标签
                var script = document.createElement('script');
                script.src = params.url;
                script.type = 'text/javascript';
                document.body.appendChild(script);
            } catch (error) {
                reject(error);
            }
        });
    }

    /**
     * 设置请求参数
     * @param {Object} params 请求参数
     */
    setRequestParams(params) {
        if (params.baseUrl === null) {
            //当baseUrl 等于 null 的时候，设置为空（一般用户请求本地服务）
            params.baseUrl = '';
        } else {
            params.baseUrl = params.baseUrl || this.baseUrl;
        }
        if (!params.data) {
            params.data = {};
        }
        if (!params.headers) {
            params.headers = {};
        }
    }
}

export default BaseApi;
